function superMixin(source, target) {
    function getClassName(fn) {
        return fn.toString().match(/n (.*)\(/)[1];
    }
    var targetProto = target.prototype,
        targetName = getClassName(target),
        sourceProto = source.prototype;
    for (var key in targetProto) {
        if (key in sourceProto) {
            source.prototype[targetName + '-' + key] = targetProto[key];
        } else {
            source.prototype[key] = targetProto[key];
        }
    }
    return source;
}
/**
 * Single Extend
 * @param base
 * @param parent
 */
function extend(base, parent) {
    var F = function () {};
    F.prototype = parent.prototype;
    base.prototype = new F();
    base.prototype.constructor = base;
    base.parent = parent.prototype;
    if (parent.prototype.constructor == Object.prototype.constructor) {
        parent.prototype.constructor = parent;
    }
}
/**
 * Multi Extend
 * @param base
 * @param parent
 * @param otherArr
 */
function extendMul(base, parent, otherArr) {
    extend(base,parent);
    for(var i= 0,len=otherArr.length;i<len; i++){
        base=superMixin(base,otherArr[i]);
    }
    return base;
}